package com.guochu.common;

import java.util.HashMap;

/**
 * 自定义返回值实体类
 *
 * <p>后台返回值主要面向前端
 *
 * @author bunting.wei
 * @since 2020-12-11 09:19:40
 */
public class ResultMap extends HashMap<String, Object> {
    private static final long serialVersionUID = 1L;

    /**
     * 定义一个构造方法，供实例化时默认返回实体
     */
    public ResultMap() {
        put("code", 200);
        put("msg", "成功");
    }

    /**
     * 默认返回值，实例化该类
     *
     * @return 实例化对象
     */
    public static ResultMap success() {
        return new ResultMap();
    }

    /**
     * 自定义成功返回对象的描述信息
     *
     * <p>put("msg", msg)：覆盖原有的默认描述
     *
     * @param msg
     * @return 实例化对象
     */
    public static ResultMap success(String msg) {
        ResultMap r = new ResultMap();
        r.put("msg", msg);
        return r;
    }

    /**
     * 返回异常信息
     *
     * <p>返回调用接口过程中所遇到的 可预测 或 不可预测 的异常信息
     *
     * @param msg
     * @return
     */
    public static ResultMap error(String msg) {
        return error("", msg);
    }

    /**
     * 输出异常实例对象
     *
     * <p>不可测情况时 msg 是 null
     *
     * @param code
     * @param msg
     * @return
     */
    public static ResultMap error(String code, String msg) {
        ResultMap r = new ResultMap();
        r.put("code", code);
        r.put("msg", msg);
        return r;
    }

    /**
     * 往该实例对象内push键值对
     *
     * @param key
     * @param value
     * @return 实例化对象
     */
    @Override
    public ResultMap put(String key, Object value) {
        // super 调用父类 的方法，该方法返回是 null，但是值已经存入该实例
        Object put = super.put(key, value);
        // return this 就是返回当前对象的引用(就是实际调用这个方法的实例化对象)
        // 所以可以在Controller层执行 .put() 方法而会往实例过的 对象 内存值
        return this;
    }
}
